﻿using DexComanda.Models;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using System.Drawing;
using System.Drawing.Printing;
using DexComanda.Properties;
using DexComanda.Models;

namespace DexComanda
{
    public partial class frmVendaDireta : Form
    {
        protected Conexao con;
        private int iten = 0;
        private decimal totalVenda = 0;
        private int consumidorFinal = 1;
        protected ConexaoMysql conMysql;
        private ItemVenda ItensVenda;
        private DataSet result;
        private Font printFont;
        public Venda venda;
        public int formaPagamento;
        private frmFinalizarVenda finaliza;
        private bool balanca = false;
        decimal valorProduto = 0;
        decimal valorUnitario = 0;

        public frmVendaDireta()
        {

            InitializeComponent();


        }

        private void carregafrmVendaDireta(object sender, EventArgs e)
        {
            con = new Conexao();
            conMysql = new ConexaoMysql();
            //Instância o finalizavenda
            finaliza = new frmFinalizarVenda();
            txtCodigoDeBarra.Focus();
        }

        private void colocarItemPorCodigoDeBarras(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Multiply)
            {
                txtQuantidadeProduto.Text = txtCodigoDeBarra.Text;
                txtCodigoDeBarra.Focus();
                txtCodigoDeBarra.Text = null;
            }
            if (txtCodigoDeBarra.Text == "*")
            {
                txtCodigoDeBarra.Text = null;
            }

            if (e.KeyCode == Keys.Enter)
            {

                if (txtCodigoDeBarra.Text != "")
                {
                    balanca = false;

                    if (txtCodigoDeBarra.Text.Substring(0, 1) == "2" && txtCodigoDeBarra.Text.Length == 13)
                    {

                        balanca = true;
                        string codigoBarras = txtCodigoDeBarra.Text.Substring(1, 4).TrimStart('0');
                        string StringValorProduto = txtCodigoDeBarra.Text.Substring(6, 6).Insert(4, ",");
                        valorProduto = decimal.Parse(StringValorProduto);

                        txtCodigoDeBarra.Text = codigoBarras;
                        result = conMysql.ConsultarProdutoPorCodigo(this.txtCodigoDeBarra.Text.ToString());
                    }
                    else if (txtCodigoDeBarra.Text.Length == 13)
                    {
                        result = conMysql.ConsultarProdutoPorCodigoDeBarra(this.txtCodigoDeBarra.Text.ToString());
                    }
                    else
                    {
                        result = conMysql.ConsultarProdutoPorCodigo(this.txtCodigoDeBarra.Text.ToString());
                    }

                    if (result.Tables["produto"].Rows.Count > 0)
                    {
                        if (txtQuantidadeProduto.Text != "")
                        {
                            DataRow dRow = result.Tables["produto"].Rows[0];
                            String nomeProduto = dRow.ItemArray.GetValue(2).ToString();

                            if (balanca)
                            {
                                valorUnitario = valorProduto;
                            }
                            else
                            {
                                valorUnitario = Math.Round(decimal.Parse(dRow.ItemArray.GetValue(62).ToString()), 2);
                            }
                            decimal itemValorTotal = valorUnitario * int.Parse(txtQuantidadeProduto.Text.ToString());


                            txtNomeProduto.Text = nomeProduto;
                            txtItemValorUnitario.Text = "R$ " + valorUnitario.ToString();
                            txtItemValorTotal.Text = "R$" + itemValorTotal.ToString();
                            //Prenche a Grid {Código de Barra, Nome do Produto, Quantidade, Preço Unitario, Preço Total}
                            gridViewProdutos.Rows.Add(iten, txtCodigoDeBarra.Text, nomeProduto, int.Parse(txtQuantidadeProduto.Text), Convert.ToDecimal(valorUnitario), Convert.ToDecimal(itemValorTotal));
                            iten++;
                            gridViewProdutos.FirstDisplayedScrollingRowIndex = iten - 1;

                            int totalLinhas = gridViewProdutos.RowCount - 1;
                            gridViewProdutos.CurrentCell = gridViewProdutos.Rows[totalLinhas].Cells[0];

                            txtCodigoDeBarra.Text = null;

                            totalVenda = 0;
                            //Soma valor total
                            foreach (DataGridViewRow linha in gridViewProdutos.Rows)
                            {
                                totalVenda += Convert.ToDecimal(linha.Cells[5].Value);
                            }

                            lblTotal.Text = "R$" + totalVenda.ToString();

                            txtQuantidadeProduto.Text = "1";
                        }
                        else
                        {
                            MessageBox.Show("Informe a Quantidade.");
                        }
                    }
                    else
                    {
                        MessageBox.Show("Nenhum produto cadastrado.");
                        txtCodigoDeBarra.Text = null;
                        txtQuantidadeProduto.Text = "1";
                    }
                }
            }

            if (e.KeyCode == Keys.Down)
            {
                gridViewProdutos.Focus();
            }

        }

        protected void fecharVenda(object sender, EventArgs e)
        {
            if (iten == 0)
            {
                MessageBox.Show("Para finalizar a venda, a mesma deve conter pelo menos um produto.");
            }
            else
            {
                finaliza.lblValorTotal.Text = lblTotal.Text;
                finaliza.ShowDialog();
                consumidorFinal = int.Parse(finaliza.txtCodigoCliente.Text);


                //Trocar para consulta no banco de dados
                switch (finaliza.cbxFormaPagamento.Text)
                {
                    case "Dinheiro":
                        formaPagamento = 0;
                        break;
                    case "Débito":
                        formaPagamento = 1;
                        break;
                    case "Crédito":
                        formaPagamento = 2;
                        break;
                    case "Alimentação":
                        formaPagamento = 3;
                        break;
                    case "Refeição":
                        formaPagamento = 4;
                        break;
                    default:
                        formaPagamento = 0;
                        break;

                }
                venda = new Venda()
                {
                    codigoPessoa = consumidorFinal,
                    ValorDaVenda = totalVenda,
                    DataVenda = Convert.ToDateTime(DateTime.Now),
                    FormaDePagamento = formaPagamento

                };
                con.Insert("spAdicionarVenda", venda);
                foreach (DataGridViewRow linhaParaCadastro in gridViewProdutos.Rows)
                {

                    ItensVenda = new ItemVenda()

                    {
                        CodVenda = con.getLastCodigo(),
                        CodBarProduto = Convert.ToInt64(linhaParaCadastro.Cells[1].Value.ToString()),
                        NomeProduto = linhaParaCadastro.Cells[2].Value.ToString(),
                        Quantidade = Convert.ToDecimal(linhaParaCadastro.Cells[3].Value),
                        PrecoUnitario = Convert.ToDecimal(linhaParaCadastro.Cells[4].Value),
                        PrecoTotalItem = Convert.ToDecimal(linhaParaCadastro.Cells[5].Value)

                    };
                    con.Insert("spAdicionarItemVenda", ItensVenda);

                }
                //prepararImpressao();
                MessageBox.Show("Venda Realizada com Sucesso");
                //frmVendaDireta NovaVenda = new frmVendaDireta();
                //NovaVenda.Show();
                //timer1.Start();
                Reset();

            }


        }

        private void prepararImpressao()
        {
            try
            {
                printFont = new Font("Arial", 8);
                PrintDocument pd = new PrintDocument();

                pd.PrintPage += new PrintPageEventHandler(this.imprimir);
                pd.Print();

            }
            catch (Exception)
            {
                MessageBox.Show("Erro ao Imprimir arquivo, verifique a impressora");
                // prepararImpressao();
            }

        }

        private void imprimir(object sender, PrintPageEventArgs ev)
        {

            string line = null;
            int i = 0;

            foreach (DataGridViewRow ItensParaCadastro in gridViewProdutos.Rows)
            {
                Empresa empresa = AutoConfig.getEmpresa();

                if (i == 0)
                {
                    line = "             RELATÓRIO GERENCIAL \r\n";
                    line += "====================================================== \r\n";
                    line += " DEX Vendas - Via Cliente - Venda Nº" + con.getLastCodigo() + "\r\n";
                    line += "        " + empresa.Nome.ToString().ToUpper() + "\r\n";
                    line += "        " + empresa.Endereco.ToString().ToUpper() + " Nº" + empresa.Numero.ToString() + "\r\n";
                    line += "        " + empresa.Bairro.ToString().ToUpper() + "-" + empresa.Cidade.ToString().ToUpper() + "/" + empresa.UF.ToString().ToUpper() + "\r\n";
                    line += "        " + empresa.Cep.ToString() + "\r\n";
                    line += "        Tel.:" + empresa.Telefone.ToString() + "\r\n";
                    line += "======================================================\r\n";
                    line += " Emitido em " + DateTime.Now.ToShortDateString();
                    line += " às " + DateTime.Now.ToShortTimeString() + "\r\n\n";
                    line += "          ========== SEM VALOR FISCAL ===========\r\n\n";
                    line += "====================================================== \r\n\n";
                    line += " Cliente: " + finaliza.txtNomeCliente.Text + "\r\n\n";
                    line += " TOTAL   " + venda.ValorDaVenda.ToString() + "\r\n";
                    line += " ======================================================\r\n\n";
                    line += " QTD                NOME                          VALOR Total item\r\n\n";

                }

                line += "  " + ItensParaCadastro.Cells[3].Value.ToString() + "    x    " + ItensParaCadastro.Cells[2].Value.ToString().Substring(0, 10) + "               R$" + ItensParaCadastro.Cells[5].Value.ToString() + "\r\n\n";
                ev.Graphics.DrawString(line, printFont, Brushes.Black, 0, 0);
                ev.HasMorePages = false;
                i++;


            }

            ev.HasMorePages = false;
        }

        private void fecharForm(object sender, EventArgs e)
        {
            this.Close();
        }

        private void excluirItem(object sender, KeyEventArgs e)
        {


            if (e.KeyCode == Keys.Up && gridViewProdutos.Rows.GetFirstRow(DataGridViewElementStates.Selected) == 0)
            {
                txtCodigoDeBarra.Focus();
            }



            if (e.KeyCode == Keys.Delete)
            {

                try
                {
                    gridViewProdutos.Rows.RemoveAt(gridViewProdutos.Rows.GetFirstRow(DataGridViewElementStates.Selected));
                    iten--;
                    totalVenda = 0;
                    //Soma valor total
                    foreach (DataGridViewRow linha in gridViewProdutos.Rows)
                    {
                        totalVenda += Convert.ToDecimal(linha.Cells[5].Value);
                    }

                    lblTotal.Text = "R$" + totalVenda.ToString();

                }
                catch (Exception)
                {


                }


            }
        }

        private void teclasAtalho(object sender, KeyEventArgs e)
        {

            if (e.KeyCode == Keys.Escape)
            {
                Close();
            }
            if (e.KeyCode == Keys.F2)
            {

                this.btnFecharVenda.PerformClick();
            }
            if (e.KeyCode == Keys.F3)
            {
                frmVendaDireta NovaVenda = new frmVendaDireta();
                NovaVenda.Show();
                timer1.Start();
                txtCodigoDeBarra.Focus();
            }


        }

        private void button1_Click(object sender, EventArgs e)
        {
            frmVendaDireta NovaVenda = new frmVendaDireta();
            NovaVenda.Show();
            timer1.Start();
            txtCodigoDeBarra.Focus();
        }


        public void Reset()
        {
            iten = 0;
            txtCodigoDeBarra.Text = "";
            txtCodigoDeBarra.Focus();
            txtNomeProduto.Text = "";
            txtQuantidadeProduto.Text = "1";
            txtItemValorUnitario.Text = "";
            txtItemValorTotal.Text = "";
            gridViewProdutos.DataSource = null;
            gridViewProdutos.Rows.Clear();
            lblTotal.Text = "";
            lbVlrTotal.Text = "";


        }

    }
}